package router

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
	"learn-land-crawler/app/router/crawler"
	"log"
)

type Option func(*gin.Engine)

var options = []Option{crawler.Routers}

// 1、自定义的校验方法
func nameNotNullAndAdmin(fl validator.FieldLevel) bool {

	if value, ok := fl.Field().Interface().(string); ok {
		// 字段不能为空，并且不等于  admin
		return value != "" && !("admin" == value)
	}
	return false
}

// Init 初始化web路由和组件相关
func Init() *gin.Engine {
	gin.DefaultWriter = log.Default().Writer()
	r := gin.New()

	// 3、将我们自定义的校验方法注册到 validator中
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		// 这里的 key 和 fn 可以不一样最终在 structure 使用的是 key
		v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)
	}
	// 业务接口
	for _, opt := range options {
		opt(r)
	}
	// 公共路由
	publicRoute(r)
	return r
}

func publicRoute(e *gin.Engine) {
	e.NoRoute(func(c *gin.Context) {
		Failure(c, 404, "接口不存在")
	})
}
